<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Помошник для работы текстом
 * 
 * @package CoreFramework
 * @version 1.0
 * @author Gennadiy Kozlenko
 */

/**
 * Транслитерация текста
 *
 * @access pubcli
 * @param string $text
 * @return string
 */
function transliteration($text) {
   $table = array(
      'А' => 'A',
      'Б' => 'B',
      'В' => 'V',
      'Г' => 'G',
      'Д' => 'D',
      'Е' => 'E',
      'Ё' => 'Yo',
      'Ж' => 'Zh',
      'З' => 'Z',
      'И' => 'I',
      'Й' => 'Y',
      'К' => 'K',
      'Л' => 'L',
      'М' => 'M',
      'Н' => 'N',
      'О' => 'O',
      'П' => 'P',
      'Р' => 'R',
      'С' => 'S',
      'Т' => 'T',
      'У' => 'U',
      'Ф' => 'F',
      'Х' => 'H',
      'Ц' => 'Ts',
      'Ч' => 'Ch',
      'Ш' => 'Sh',
      'Щ' => 'Shch',
      'Ъ' => '',
      'Ы' => 'I',
      'Ь' => '',
      'Э' => 'E',
      'Ю' => 'Yu',
      'Я' => 'Ya',
      'а' => 'a',
      'б' => 'b',
      'в' => 'v',
      'г' => 'g',
      'д' => 'd',
      'е' => 'e',
      'ё' => 'yo',
      'ж' => 'zh',
      'з' => 'z',
      'и' => 'i',
      'й' => 'y',
      'к' => 'k',
      'л' => 'l',
      'м' => 'm',
      'н' => 'n',
      'о' => 'o',
      'п' => 'p',
      'р' => 'r',
      'с' => 's',
      'т' => 't',
      'у' => 'u',
      'ф' => 'f',
      'х' => 'h',
      'ц' => 'ts',
      'ч' => 'ch',
      'ш' => 'sh',
      'щ' => 'shch',
      'ъ' => '',
      'ы' => 'i',
      'ь' => '',
      'э' => 'e',
      'ю' => 'yu',
      'я' => 'ya',
      ' ' => '-'
   );
   return strtr($text, $table);
} // end transliteration

/**
 * Лимитация текста по количесву символов
 * 
 * @param string $str
 * @param integer $n
 * @param string $end_char
 * @return string
 */
function character_limiter($str, $n = 500, $end_char = '&#8230;') {
   $config =& load_class('Config');
   if (mb_strlen($str, $config->item('charset')) < $n) {
      return $str;
   }
   
   if (mb_strlen($str, $config->item('charset')) <= $n) {
      return $str;
   }
                        
   $out = "";
   foreach (explode(' ', trim($str)) as $val) {
      $out .= $val.' ';       
      if (mb_strlen($out, $config->item('charset')) >= $n) {
         return trim($out).$end_char;
      }     
   }
} // end character_limiter

function tokenize($text) {
   $tokens = array();
   // Переводим строку в нижний регистр
   $text = mb_strtolower($text, 'UTF-8');
   // Убираем мусор из строки
   $text = preg_replace('~[^a-zа-я0-9\s]~msiu', '', $text);
   // Разбиваем строку на токены
   $tokens = preg_split('~\s+~', $text);
   return $tokens;
}

/**
 * Убирание битых символов из строки
 * 
 * @param $str
 * @param $replace
 * @return string
 */
function bad_replace($str, $replace = '') {
    $UTF8_BAD =
        '([\x00-\x7F]'.                          # ASCII (including control chars)
        '|[\xC2-\xDF][\x80-\xBF]'.               # non-overlong 2-byte
        '|\xE0[\xA0-\xBF][\x80-\xBF]'.           # excluding overlongs
        '|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}'.    # straight 3-byte
        '|\xED[\x80-\x9F][\x80-\xBF]'.           # excluding surrogates
        '|\xF0[\x90-\xBF][\x80-\xBF]{2}'.        # planes 1-3
        '|[\xF1-\xF3][\x80-\xBF]{3}'.            # planes 4-15
        '|\xF4[\x80-\x8F][\x80-\xBF]{2}'.        # plane 16
        '|(.{1}))';                              # invalid byte
    ob_start();
    while (preg_match('/'.$UTF8_BAD.'/S', $str, $matches)) {
        if (!isset($matches[2])) {
            echo $matches[0];
        } else {
            echo $replace;
        }
        $str = substr($str, strlen($matches[0]));
    }
    $result = ob_get_contents();
    ob_end_clean();
    return $result;
}
